﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuanLyNganHangDe.DAL
{
    public enum TagTaskStatus : int
    {
        ChuaThucHien = 0,
        Loi = 1,
        ThanhCongNhungCoCanhBao = 2,
        ThanhCong = 3
    }

    public class TagTask
    {
        private System.IO.FileInfo m_FileInfo;

        /// <summary>
        /// tệp đầu vào
        /// </summary>
        public string InputFilename { get; private set; }

        /// <summary>
        /// tệp đầu ra
        /// </summary>
        public string OutputFilename { get; set; }

        /// <summary>
        /// trạng thái, thể hiện kết quả của quá trình đánh dấu
        /// </summary>
        public TagTaskStatus Status { get; private set; }

        /// <summary>
        /// danh sách các cảnh báo
        /// </summary>
        public string Warnings { get; private set; }

        /// <summary>
        /// số lượng cảnh báo
        /// </summary>
        public int NumberOfWarnings { get; set; }

        /// <summary>
        /// hàm khởi dựng
        /// </summary>
        /// <param name="inputFilename"></param>
        public TagTask(string inputFilename)
        {
            this.InputFilename = inputFilename;
            this.m_FileInfo = new System.IO.FileInfo(inputFilename);
            this.SetNotTaggedYet();
        }

        /// <summary>
        /// thiết lập task chưa được thực hiện
        /// </summary>
        public void SetNotTaggedYet()
        {
            this.Status = TagTaskStatus.ChuaThucHien;
            this.NumberOfWarnings = -1;
            this.Warnings = null;
        }

        /// <summary>
        /// thiết lập task thành công
        /// </summary>
        public void SetOK()
        {
            this.Status = TagTaskStatus.ThanhCong;
            this.NumberOfWarnings = 0;
            this.Warnings = "";
        }

        /// <summary>
        /// thiết lập task thành công nhưng có cảnh báo
        /// </summary>
        /// <param name="n"></param>
        /// <param name="warnings"></param>
        public void SetWarnings(int n, string warnings)
        {
            this.Status = TagTaskStatus.ThanhCongNhungCoCanhBao;
            this.NumberOfWarnings = n;
            this.Warnings = warnings;
        }

        /// <summary>
        /// thiết lập task gặp lỗi
        /// </summary>
        /// <param name="exc"></param>
        public void SetError(Exception exc)
        {
            this.Status = TagTaskStatus.Loi;
            this.Warnings = exc.ToString();
            this.NumberOfWarnings = -1;
        }

        /// <summary>
        /// nội dung lỗi
        /// </summary>
        public string Error
        {
            get
            {
                if (this.Status == TagTaskStatus.Loi)
                    return this.Warnings;
                return "";
            }
        }

        public string Name
        {
            get { return this.m_FileInfo.Name; }
        }

        public override string ToString()
        {
            return this.m_FileInfo.Name;
        }

        public string Description
        {
            get
            {
                if (this.Status == TagTaskStatus.ChuaThucHien)
                    return string.Format("{0}\r\nChưa thực hiện\r\nTệp đầu vào: {1}", this.Name, this.InputFilename);
                else if (this.Status == TagTaskStatus.Loi)
                    return string.Format("{0}\r\nLỗi\r\nTệp đầu vào: {1}\r\nTệp đầu ra: {2}\r\nChi tiết lỗi: {3}",
                        this.Name, this.InputFilename, this.OutputFilename, this.Error);
                else if (this.Status == TagTaskStatus.ThanhCong)
                    return string.Format("{0}\r\nThành công\r\nTệp đầu vào: {1}\r\nTệp đầu ra: {2}",
                        this.Name, this.InputFilename, this.OutputFilename);
                else
                    return string.Format("{0}\r\nĐã đánh dấu. Cần kiểm tra lại.\r\nTệp đầu vào: {1}\r\nTệp đầu ra: {2}\r\nChi tiết lỗi: {3}",
                        this.Name, this.InputFilename, this.OutputFilename, this.Warnings);
            }
        }
    }

    public class TagOption
    {
        public string PhanCauHoi_Begin { get; set; }
        public string PhanCauHoi_End { get; set; }
        public string KhoiCauHoi_Begin { get; set; }
        public string KhoiCauHoi_End { get; set; }
        public string CauHoi_Begin { get; set; }
        public string CauHoi_End { get; set; }

        public string PhanDapAn_Begin { get; set; }
        public string PhanDapAn_End { get; set; }
        public string KhoiDapAn_Begin { get; set; }
        public string KhoiDapAn_End { get; set; }
        public string DapAn_Begin { get; set; }
        public string DapAn_End { get; set; }

        public static TagOption Default
        {
            get
            {
                return new TagOption()
                {
                    PhanCauHoi_Begin = "[lq_start]",
                    PhanCauHoi_End = "[lq_end]",
                    KhoiCauHoi_Begin = "[part_start]",
                    KhoiCauHoi_End = "[part_end]",
                    CauHoi_Begin = "[question_start]",
                    CauHoi_End = "[question_end]",
                    PhanDapAn_Begin = "[la_start]",
                    PhanDapAn_End = "[la_end]",
                    KhoiDapAn_Begin = "[part_ans_start]",
                    KhoiDapAn_End = "[part_ans_end]",
                    DapAn_Begin = "[anw_start]",
                    DapAn_End = "[anw_end]"
                };
            }
        }
    }
}
